package com.xiaoyu.arrays;

import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;

/**
 * @program: DS_and_A
 * @description:  判断字符串唯一
 *
 * 实现一个算法，确定一个字符串 s 的所有字符是否全都不同。
 *
 * 示例 1：
 *
 * 输入: s = "leetcode"
 * 输出: false
 * @author: YuWenYi
 * @create: 2021-05-28 20:56
 **/
public class IsUnique_0101 {

    //解法一:使用hashset的无重新性
    public static boolean isUnique(String astr) {
        HashSet<Character> set = new HashSet<>();
        char[] chars = astr.toCharArray();
        for (char aChar : chars) {
            set.add(aChar);
        }
        return chars.length == set.size();
    }

    //解法二:不使用其他的数据结构
    public static boolean isUnique1(String astr) {
        char[] chars = astr.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            for (int j = 0; j < chars.length; j++) {
               if (j != i){
                   if (chars[i] == chars[j]){
                       return false;
                   }
               }
            }
        }
        return true;
    }
    //方法三,使用常量级的变量,然后使用位运算去处理
    /*
    * 首先计算出字符char离'a'这个字符的距离，即我们要位移的距离，
    * 用move_bit表示，那么使用左移运算符1 << move_bit则可以得到对应下标为1，
    * 其余下标为0的数，如字符char = 'c'，则得到的数为000...00100
    * */
    public static boolean isUnique2(String astr) {
        int mark = 0;
        //因为astr是a-z的字母
        for (int i = 0; i < astr.length(); i++) {
           int moveBit = astr.charAt(i) - 'a';
           if ((1<<moveBit & mark) != 0){
               return false;
           }else {
               mark = mark | (1<<moveBit);
           }
        }
        return true;
    }


    public static void main(String[] args) {
        System.out.println(isUnique2("abcdz"));
    }
}
